home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung 2 / Power-Programmierung CD 2 (Tewi)(1994).iso / c / library / dos / diverses / leda / incl / seg_tree.h < prev    next >
Encoding:
C/C++ Source or Header  |  1991-11-15  |  8.6 KB  |  316 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  2.1.1                                                 11-15-1991
  4. +
  5. +
  6. +  seg_tree.h
  7. +
  8. +
  9. +  Copyright (c) 1991  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15.  
  16.  
  17.  
  18. // ------------------------------------------------------------------
  19. //
  20. // full dynamic Segment Trees
  21. //
  22. // Michael Wenzel     (1990)
  23. //
  24. // Implementation follows
  25. // Kurt Mehlhorn: Data Structures and Algorithms, Vol. 3
  26. //
  27. // ------------------------------------------------------------------
  28.  
  29.  
  30. #ifndef SEGMENTTREEH
  31. #define SEGMENTTREEH
  32.  
  33.  
  34. #include <LEDA/bb_tree.h>
  35. #include <LEDA/list.h>
  36.  
  37. // ------------------------------------------------------------------
  38. // declarations and definitions 
  39. // ----------------------------------------------------------------- 
  40.  
  41.  
  42. class h_segment;
  43. typedef h_segment* h_segment_p;
  44.  
  45. class seg_node_tree;
  46. typedef seg_node_tree* seg_node_list;
  47.  
  48.  
  49. typedef bb_node* seg_tree_item;
  50. declare(list,seg_tree_item);
  51.  
  52. //------------------------------------------------------------------
  53. // class h_segment
  54. //------------------------------------------------------------------
  55.  
  56. class h_segment {
  57.  
  58.   ent _x0;
  59.   ent _x1;
  60.   ent _y;
  61.   ent _inf;
  62.  
  63.  public:
  64.  
  65.  ent& x0()    { return _x0;   }
  66.  ent& x1()    { return _x1;   }
  67.  ent& y()     { return _y;    }
  68.  ent& info()  { return _inf;  }
  69.  
  70.  h_segment()
  71.    _x0 = _x1 = _y = _inf = 0;
  72.  }
  73.  
  74.  h_segment(ent x0, ent x1, ent y, ent i=0)
  75.    _x0  = x0;
  76.    _x1  = x1;
  77.    _y   = y;
  78.    _inf = i;
  79.  }
  80.  
  81. OPERATOR_NEW(4)
  82. OPERATOR_DEL(4)
  83.  
  84.  friend ostream& operator<<(ostream&, h_segment&);
  85.  friend class Segment_Tree;
  86.  friend class seg_node_tree;
  87.  
  88. };
  89.  
  90.  
  91. /*------------------------------------------------------------------
  92.    class seg_node_tree = Dictionary(seg_tree_item , void* )
  93. -------------------------------------------------------------------*/
  94.  
  95. struct seg_node_tree : public bb_tree {
  96.  
  97. Segment_Tree* father;
  98.  
  99. int cmp(ent& x,ent& y) ;
  100.  
  101. list(seg_tree_item) query(ent, ent);
  102. list(seg_tree_item) all_items();
  103.  
  104. int            defined(h_segment_p y)    { return bb_tree::member(Ent(y)); }
  105. seg_tree_item  lookup(h_segment_p y)     { return bb_tree::lookup(Ent(y)); }
  106. seg_tree_item  locate(h_segment_p y)     { return bb_tree::locate(Ent(y)); }
  107. seg_tree_item  ord(int y)                { return bb_tree::ord(int(y)); }
  108. seg_tree_item  insert(h_segment_p y, ent i=0 )
  109.                                  { return bb_tree::insert(Ent(y),i); } 
  110. void del(h_segment_p y)          { delete bb_tree::del(Ent(y)); } 
  111. void del_item(seg_tree_item it)  { del(key(it)); } 
  112.  
  113. h_segment_p& key(seg_tree_item it)   
  114.          { if (!it) error_handler(1,"seg_tree_item gleich nil");
  115.                return (h_segment_p&)it->ke  ; }
  116. ent& info(seg_tree_item it)              { return key(it)->info(); } 
  117. void        change_inf(seg_tree_item it, ent i) { key(it)->info() = i; }
  118.  
  119. seg_node_tree(Segment_Tree* p)   {father = p;}
  120. ~seg_node_tree()  {}
  121.  
  122. friend class Segment_Tree;
  123.  
  124. } ;
  125.  
  126.  
  127. #define forall_seg_tree_items(a,b) for ((b).init_iterator(); a=(b).move_iterator(); )
  128.  
  129.  
  130.  
  131. //------------------------------------------------------------------
  132. // class segment_tree
  133. //------------------------------------------------------------------
  134.  
  135. class Segment_Tree  : public bb_tree {
  136.  
  137.  
  138. virtual  h_segment_p new_y_h_segment(ent y)
  139. { cout << "error: virtual new_y_h_segment\n"; y=0; return 0; }
  140.  
  141. virtual int cmp_dim1(ent& x,ent& y) {return int(x)-int(y);}
  142. virtual int cmp_dim2(ent& x,ent& y) {return int(x)-int(y);}
  143.  
  144. virtual void clear_dim1(ent& x)     { x=0; }
  145. virtual void clear_dim2(ent& x)     { x=0; }
  146. virtual void clear_info(ent& x)     { x=0; }
  147.  
  148. virtual void copy_dim1(ent& x)     { x=x; }
  149. virtual void copy_dim2(ent& x)     { x=x; }
  150. virtual void copy_info(ent& x)     { x=x; }
  151.  
  152. int seg_cmp(h_segment_p p, h_segment_p q);
  153.  
  154.   void lrot(bb_item , bb_item);
  155.   void rrot(bb_item , bb_item);
  156.   void ldrot(bb_item , bb_item);
  157.   void rdrot(bb_item , bb_item);
  158.  
  159.   void change_inf(bb_item it, seg_node_list i)   { info(it) = i; }
  160.   ent& key(bb_item it)       
  161.        { if (!it) error_handler(1,"bb_item in segment_tree gleich nil");
  162.      return it->ke; }
  163.   seg_node_list& info(bb_item it)    { return (seg_node_list&)(bb_tree::info(it)); } 
  164.  
  165.   int start_coord(bb_item& x,seg_tree_item& i)
  166.       { return (!cmp(key(x),x0(i))); }
  167.   int end_coord(bb_item& x,seg_tree_item& i)
  168.       { return (!cmp(key(x),x1(i))); }
  169.  
  170.   int empty(bb_item);
  171.   void clear(bb_item& );
  172.   void print(bb_item , string); 
  173.  
  174.   protected:
  175.  
  176.   seg_node_tree r;                // tree with all segments
  177.  
  178.  
  179.   int cmp_dummy(int a, int b, int c);
  180.  
  181.  
  182.   public :
  183.   
  184.   int cmp(ent& x,ent& y)     
  185.   { cout << "error: Segment_Tree::cmp\n"; x=y=0; return 0; }
  186.  
  187.   ent x0(seg_tree_item x)    { return (r.key(x))->_x0;  }
  188.   ent x1(seg_tree_item x)    { return (r.key(x))->_x1;  }
  189.   ent y(seg_tree_item x)     { return (r.key(x))->_y;   }
  190.   ent& inf(seg_tree_item x)  { return r.info(x);        }
  191.  
  192.   ent& x0(h_segment_p x)   { return x->_x0; }
  193.   ent& x1(h_segment_p x)   { return x->_x1; }
  194.   ent& y(h_segment_p x)    { return x->_y; }
  195.   ent& inf(h_segment_p x)  { return x->_inf; }
  196.  
  197.   void change_inf(seg_tree_item x, ent i)  { r.info(x) = i; }
  198.  
  199.   seg_tree_item insert(ent, ent, ent, ent i=0 );
  200.  
  201.   void del(ent, ent, ent);
  202.   void del_item(seg_tree_item it) { del(x0(it),x1(it),y(it)) ; }
  203.  
  204.  
  205.   seg_tree_item lookup(ent, ent, ent );
  206.   int member(ent x0, ent x1, ent y) { return (lookup(x0,x1,y)!=0 ) ; }
  207.  
  208.   list(seg_tree_item) query(ent, ent, ent );
  209.   list(seg_tree_item) x_infinity_query(ent, ent );
  210.   list(seg_tree_item) y_infinity_query(ent );
  211.   list(seg_tree_item) all_items();
  212.  
  213.   void clear_tree();  
  214.  
  215.    Segment_Tree();
  216.   ~Segment_Tree();
  217.  
  218.   int size()                   { return r.size();   }
  219.   int empty()                  { return (r.size()==0) ; }
  220.  
  221.   seg_tree_item y_min()        { return r.min();    }
  222.   seg_tree_item y_max()        { return r.max();    }
  223.  
  224.   void init_iterator()            { r.init_iterator(); }
  225.   seg_tree_item move_iterator()   { return r.move_iterator(); }
  226.  
  227.   void print_tree()               { print(root,"");    }
  228.  
  229.  
  230.   friend class seg_node_tree;
  231.  
  232. };
  233.  
  234.  
  235. //------------------------------------------------------------------
  236. // typed segment_tree
  237. //------------------------------------------------------------------
  238.  
  239. #define segment_tree(type1,type2,itype) name4(type1,type2,itype,segment_tree)
  240.  
  241. #define segment_treedeclare3(type1,type2,itype)\
  242. \
  243. struct segment_tree(type1,type2,itype) : public Segment_Tree {\
  244. \
  245. h_segment_p new_y_h_segment(ent y)\
  246. { type1 x1;\
  247.   type2 x2;\
  248.   return new h_segment(Copy(x1),Copy(x2),y);\
  249.  }\
  250. \
  251. int cmp_dim1(ent& x,ent& y) { return compare(*(type1*)&x,*(type1*)&y); }\
  252. int cmp_dim2(ent& x,ent& y) { return compare(*(type2*)&x,*(type2*)&y); }\
  253. \
  254. void clear_dim1(ent& x)     { Clear(*(type1*)&x); }\
  255. void clear_dim2(ent& x)     { Clear(*(type2*)&x); }\
  256. void clear_info(ent& x)     { Clear(*(itype*)&x); }\
  257. \
  258. void copy_dim1(ent& x)     { x = Copy(*(type1*)&x); }\
  259. void copy_dim2(ent& x)     { x = Copy(*(type2*)&x); }\
  260. void copy_info(ent& x)     { x = Copy(*(itype*)&x); }\
  261. \
  262. int cmp(ent& x,ent& y)      { return compare((type1&)x,(type1&)y); }\
  263. \
  264. type1  x0(seg_tree_item it)  { return type1(Segment_Tree::x0(it)); }\
  265. type1  x1(seg_tree_item it)  { return type1(Segment_Tree::x1(it)); }\
  266. type2   y(seg_tree_item it)  { return type2(Segment_Tree::y(it));  }\
  267. itype inf(seg_tree_item it)  { return itype(Segment_Tree::inf(it));}\
  268. \
  269. seg_tree_item insert(type1 x0, type1 x1, type2 y, itype i)\
  270. { return Segment_Tree::insert(Ent(x0),Ent(x1),Ent(y),Ent(i)); }\
  271. \
  272. void del(type1 x0, type1 x1, type2 y)\
  273. { Segment_Tree::del(Ent(x0),Ent(x1),Ent(y)); }\
  274. \
  275. seg_tree_item lookup(type1 x0, type1 x1, type2 y)\
  276. { return Segment_Tree::lookup(Ent(x0),Ent(x1),Ent(y)); }\
  277. \
  278. int member(type1 x0, type1 x1, type2 y)\
  279. { return Segment_Tree::member(Ent(x0),Ent(x1),Ent(y)); }\
  280. \
  281. list(seg_tree_item) query(type1 x,type2 y0,type2 y1)\
  282. { return Segment_Tree::query(Ent(x),Ent(y0),Ent(y1)); }\
  283. \
  284. list(seg_tree_item) x_infinity_query(type2 y0,type2 y1)\
  285. { return Segment_Tree::x_infinity_query(Ent(y0),Ent(y1)); }\
  286. \
  287. list(seg_tree_item) y_infinity_query(type1 x)\
  288. { return Segment_Tree::y_infinity_query(Ent(x)); }\
  289. \
  290. \
  291. segment_tree(type1,type2,itype)()  {}\
  292. ~segment_tree(type1,type2,itype)()\
  293.  { seg_tree_item z;\
  294.   forall_seg_tree_items(z,r)\
  295.   { Clear(x0(z)); \
  296.     Clear(x1(z)); \
  297.     Clear(y(z)); \
  298.     Clear(inf(z)); \
  299.     delete r.key(z); }\
  300.  }\
  301. \
  302. } ;
  303.  
  304.  
  305. //------------------------------------------------------------------
  306. // Iterator
  307. //------------------------------------------------------------------
  308.  
  309. #define forall_seg_tree_items(a,b) for ((b).init_iterator(); a=(b).move_iterator(); )
  310.  
  311.  
  312. #endif
  313.